package com.healthcloud.service;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import com.healthcloud.entity.ExamData;
import com.healthcloud.entity.PhysicalExam;
import com.healthcloud.entity.PhysicalExamCriteria;
import com.healthcloud.entity.TestProjectItem;
import com.healthcloud.entity.TestProjectKind;
import com.healthcloud.entity.TestResult;
import com.healthcloud.entity.TestResultApp;
import com.healthcloud.entity.TestResultCriteria;
import com.healthcloud.utils.PageParam;

/**
 * 健康体检数据相关业务逻辑
 * Created by xiam on 2015/6/22.
 */
public interface HealthExamService {

    /**
     * 保存健康体检数据
     * @param examDataList
     * @return
     */
    List<PhysicalExam> save(List<PhysicalExam> examDataList);

    /**
     * 根据体检ID编号来查找某次健康体检的所有数据
     * @param examId 健康体检ID编号
     * @return
     */
    List<ExamData> findByExamId(Long examId);

    /**
     * 根据体检ID编号和某人的身份证号码来查找健康体检数据
     * @param examId 体检ID编号
     * @param idNum 参加体检的用户的身份证号码
     * @return
     */
    PhysicalExam findByExamIdAndIdNum(String examId, String idNum);
    
    /**
     * 解析传入的体检数据
     * @param jsonStr
     * @return
     */
    PhysicalExam parseJson4Physical(Map<String,String> jsonMap);
    /**
     * 解析传入的仪器数据
     * @param jsonStr
     * @return
     */
    TestResult  parseJson4Instrument(Map<String,String> jsonMap);
    /**
     * 查询检测结果
     * @param entity
     * @return
     */
    List<TestResult> findByEntity(TestResult entity);
	/**
     * 查询TestResult(不分页)
     * @param criteria
     * @return
     */
	List<TestResult> search4Result(TestResultCriteria criteria);
	/**
	 * 查询PhysicalExam(不分页)
	 * @param criteria
	 * @return
	 */
	List<PhysicalExam> search4Physical(PhysicalExamCriteria criteria);

	/**
	 * 分页查询体检结果
	 * @param criteria
	 * @param pageable
	 * @return
	 */
	Page<TestResult> search(TestResultCriteria criteria, Pageable pageable);
	/**
	 * 分页查询体检报告
	 * @param criteria
	 * @param pageable
	 * @return
	 */
	Page<PhysicalExam> search(PhysicalExamCriteria criteria, Pageable pageable);
	/**
	 * 分页查询体检报告
	 * @param criteria 查询条件
	 * @param size 每页条数
	 * @param page 查询页数
	 * @param sort 排序字符
	 * @return
	 */
	Page<PhysicalExam> search(PhysicalExamCriteria criteria,int size,int page,Sort sort);
	/**
	 * 根据传入的json组装查询条件
	 * @param dataMap
	 * @return TestResultCriteria
	 */
	TestResultCriteria conditionByJsonMap(Map<String, String> dataMap);
	/**
	 * 根据种类（大类）和时间分组查询结果
	 * @param jsonMap
	 * @return List<Map<String,String>>
	 */
	List<Map<String,String>> findVo(Map<String, String> jsonMap);
	/**
	 * 查询体检记录，按日期分组
	 * @param jsonMap
	 * @return List<Map<K,V>> K:testDate V:String(体检日期)
	 */
	List<Map<String,String>> findVo2(Map<String, String> jsonMap);
	/**
	 * 查询体检报告列表
	 * @param whereCondition(自定义查询条件)
	 * @return List
	 */
	List<PhysicalExam> selectList4PhysicalExam(String whereCondition);
	/**
	 * 获取检验项目(小类)
	 * @param code （类型编号）
	 * @return
	 */
	TestProjectItem selectItem(String code);
	/**
	 * 获取检验项目种类（大类）
	 * @param code （类型编号）
	 * @return
	 */
	TestProjectKind selectKind(String code);
	/**
	 * 获取检验项目种类列表（大类）
	 * @return
	 */
	List<TestProjectKind> findAllKinds();
	/**
	 * 生成头像
	 * @param idCard 身份证号
	 * @param imageCode 数据库图片（base64）
	 * @param request 请求参数
	 * @return
	 */
	String faceImage(String idCard,String imageCode,HttpServletRequest request);
	/**
	 * 分组查询
	 * @param jsonMap 查询条件参数
	 * @param groupBy 分组参数
	 * @return
	 */
	List<TestResult> getGroups(Map<String, String> jsonMap,String groupBy);

	/**
	 * 获取smart检测数据
	 * 109<=id<=130
	 * @param idCard		身份证号码
	 * @param testTimeFrom	开始时间
	 * @param testTimeTo	结束时间
	 * @return List<TestResult>
	 */
	List<TestResult> getSmart(String idCard, String testTimeFrom, String testTimeTo);

	/**
	 * 获取smart检测数据testKindCode，testKindName，testTime分组信息
	 * 109<=id<=130
	 * @param idCard		身份证号码
	 * @param testTimeFrom	开始时间
	 * @param testTimeTo	结束时间
	 * @return List<TestResult>
	 */
	List<TestResult> getSmartGroup(String idCard, String testTimeFrom, String testTimeTo);
	
	/**
     * 新版移动端查询体检数据
     * @author lixx 20160525
     * @param entity
     * @return
     */
	List<TestResultApp> searchTestResultByDay(TestResultApp entity,PageParam pageParam);

	void save(TestResult result);
}
